public class No013 {
    /**
     * 地上有一个m行和n列的方格。
     * 一个机器人从坐标0,0的格子开始移动，每一次只能向左，右，上，下四个方向移动一格，但是不能进入行坐标和列坐标的数位之和大于k的格子。
     * 例如，当k为18时，机器人能够进入方格（35,37），因为3+5+3+7 = 18。但是，它不能进入方格（35,38），因为3+5+3+8 = 19。
     * 请问该机器人能够达到多少个格子？
     */
    public static int movingCount(int threshold, int rows, int cols) {
        if (threshold < 0 || rows <= 0 || cols <= 0) return 0;
        boolean[][] visit = new boolean[rows][cols];
        return find(threshold, rows, cols, 0, 0, visit);
    }

    public static int find(int threshold, int rows, int cols, int row, int col, boolean[][] visit) {
        int sum = row / 10 + row % 10 + col / 10 + col % 10;
        if (row < 0 || col < 0 || row >= rows || col >= cols || sum > threshold || visit[row][col]) {
            return 0;
        }
        visit[row][col] = true;
        return 1 + find(threshold, rows, cols, row - 1, col, visit)
                + find(threshold, rows, cols, row + 1, col, visit)
                + find(threshold, rows, cols, row, col - 1, visit)
                + find(threshold, rows, cols, row, col + 1, visit);
    }
}
